package main

import (
	"fmt"
	"html/template"
	"log"
	"os"
	"strings"
)

const templateText = `
	Output 0: {{title .Name1}}
	Output 1: {{title .Name2}}
	Output 2: {{.Name3 | title}}
`

func template1() {
	// 注册名为title的自定义函数（首字母大写）
	funcMap := template.FuncMap{"title": strings.Title}
	// 创建模板并解析
	tpl, _ := template.New("test").Funcs(funcMap).Parse(templateText)
	// 定义待渲染的数据
	data := map[string]string{
		"Name1": "go",
		"Name2": "programming",
		"Name3": "tour",
	}
	// 模板渲染
	_ = tpl.Execute(os.Stdout, data)
}

type User struct {
	Name string
	Age  int
}

func (u User) String() string {
	return fmt.Sprintf("(name:%s age:%d)", u.Name, u.Age)
}

func templateExample() {
	// 预定义模板（字符串字面量）
	s := "My name is {{.Name}}. I am {{.Age}} years old.\n"
	// {{ . }}会被替换为传给给模板的数据的字符串表示
	// s := "The user is {{ . }}.\n"
	// 创建模板，模板名为"test"；调用Parse，生成模板对象
	tpl, err := template.New("test").Parse(s)
	if err != nil {
		log.Fatal("Parse template error: ", err)
	}
	// 定义待渲染的数据参数
	user := User{Name: "xieli", Age: 30}
	// 执行模板中的动作，将结果输出到os.Stdout
	err = tpl.Execute(os.Stdout, user)
	if err != nil {
		log.Fatal("Execute template error: ", err)
	}

	template1()
}
